--第五节 函数

local UnitlModule = require("Lua.UnitlModule");

UnitlModule.PrintTimer();
UnitlModule.PrintOperaName("无参无返回值");

function F_1()
    print("这是F_1");
end

F_1();

F_2 = function ()
    print("这是F_2");
end

F_2();

UnitlModule.PrintOperaName("有参无返回值");

function F_Parms(input_a)
    print(input_a);
end

F_Parms(123);
F_Parms("sad");
F_Parms(false);

--如果传入的参数和函数参数个数不匹配
--不会报错，只会补空或丢弃
F_Parms(11,22,33);
F_Parms();

UnitlModule.PrintOperaName("有返回值");

--[[
有多返回值的时候，前面申明多个变量来接取即可
变量不够不影响，会从第一个返回值开始按顺序接收
变量多了，多的变量直接赋nil
--]]
function F_Return()
    return "llvm",123,true;
end

local tmp = F_Return();
print(tmp);
local tmp_1,tmp_2,tmp_3 = F_Return();
print(tmp_1,tmp_2,tmp_3);

F_4 = function (a)
    return a;
end
temp = F_4(666);
print(temp);


--[[
函数的类型就是function
Lua中是不支持函数的重载的
默认调用最后一个申明的函数
--]]

UnitlModule.PrintOperaName("变长参数");
function F_Args(...)
    local args = {...};
    for i = 1,#args do
    print(args[i]);
    end
end
F_Args("lo",123,true,nil);

UnitlModule.PrintOperaName("函数嵌套");

function F_5()
    print("OutFunction");
    return function ()
        print("The");
    end
end
f9 = F_5();
f9();

--闭包
function F_ClosePackge(x)
    --改变传入参数的生命周期
    print(x + 5);
    return function (y)
        print("y is "..y);
        print("x is "..x);
        return x + y;
    end
end

F_ClosePackge(7);
f10 = F_ClosePackge(6);

print(f10(7));